#ifndef RAFT_CORE_RAFTRPC_UTIL_H
#define RAFT_CORE_RAFTRPC_UTIL_H

#include "raftRPC.pb.h"

namespace raftCore 
{
/*
 * @brief 维护当前节点与**单个远程节点**的RPC通信（一对一连接）
 * 每个远程节点对应一个RaftRpcUtil实例，管理独立的MprpcChannel
 */
class RaftRpcUtil {
public:
    // **主动RPC调用**（当前节点作为发起方，相当于client）

    /*
     * @brief 发送AppendEntries RPC（Leader→Follower：心跳/日志复制）
     * @param args 包含任期、LeaderID、前日志索引/任期、日志条目、提交索引
     * @param response 接收Follower的回复（是否匹配日志、任期冲突等）
     * @return RPC调用是否成功（网络/协议层面）
     */
    bool AppendEntries(raftRpcProctoc::AppendEntriesArgs *args, 
                    raftRpcProctoc::AppendEntriesReply *response);
    /*
     * @brief 发送InstallSnapshot RPC（Leader→Follower：快照传输）
     * @param args 包含任期、LeaderID、快照元数据、数据块（用于快速同步日志）
     * @param response 接收Follower的快照接收状态
     * @return RPC调用是否成功
     */
    bool InstallSnapshot(raftRpcProctoc::InstallSnapshotRequest *args, 
                        raftRpcProctoc::InstallSnapshotResponse *response);
    
    /*
     * @brief 发送RequestVote RPC（Candidate→Follower：选举投票请求）
     * @param args 包含任期、CandidateID、最后日志索引/任期（图2投票条件）
     * @param response 接收Follower的投票结果（是否授予选票）
     * @return RPC调用是否成功  
     */          
    bool RequestVote(raftRpcProctoc::RequestVoteArgs *args, 
                    raftRpcProctoc::RequestVoteReply *response);
    
    /*
     * @brief 构造函数：建立与远程节点的RPC连接
     * @param ip 远程节点IP
     * @param port 远程节点端口
     * @note 使用MprpcChannel初始化stub_，每个节点独立连接（避免共享通道冲突
     */
    RaftRpcUtil(std::string ip, short port);
    
    /*
     * @brief 析构函数：释放RPC资源
     */
    ~RaftRpcUtil();

private:
    raftRpcProctoc::raftRpc_Stub* m_stub;    ///< Protobuf生成的RPC Stub，用于远程调用
};

}   // namespace raftCore

#endif  // RAFT_CORE_RAFTRPC_UTIL_H